package base.entity.regitem;

import java.util.Arrays;

/**
 * 登记项
 * @Author: x1aolone
 * @Date: 2019/9/27 13:39
 */
public class RegItem {

    /**
     * 文件名和类型名之间用“.”分割
     */
    private static final String FILENAME_SEPARATOR = ".";

    /**
     * 用“/”作为路径名中目录间分隔符
     */
    private static final String DIRECTORY_SEPARATOR = "/";

    /**
     * default方法（即不加修饰符），只能由本类、同一个包下的类访问
     * protected方法，只能由本类、同一个包下的类以及子类访问
     */
    protected RegItem() { }

    /**
     * 通过参数来构造对象，在工厂中已经确保参数是正确的，无需使用set来设置变量内容
     * @param name
     * @param type
     * @param property
     * @param beginFatNum
     * @param length
     */
    protected RegItem(String name, String type, byte property, byte beginFatNum, byte length) {
        this.name = name;
        this.type = type;
        this.property = property;
        this.beginFatNum = beginFatNum;
        this.length = length;
    }

//    public RegItem(byte[] bytes) {
//        if (bytes.length != 8) {
//            throw new RuntimeException("传入数组长度不为8");
//        }
//        setName(new String(bytes, 0, 3));//[0~2]是name
//        setType(new String(bytes, 3, 2));//[3~5]是type
//        setProperty(bytes[5]);//[5]是property
//        setBeginFatNum(bytes[6]);//[6]是beginFatNum
//        setLength(bytes[7]);//[7]是length
//    }

    /**
     * 文件名/目录名，3个字节，仅可以使用字母、数字和除“$”、“.”、“/”以外
     * 的字符，第一个字节的值为“$”时表示该目录为空目录项
     * 文件名和类型名之间用“.”分割，用“/”作为路径名中目录间分隔符
     */
    private String name;

    /**
     * 类型名，2个字节
     * 对文件来说是文件类型名，对目录来说此处为2字节的空格
     */
    private String type;

    /**
     * 文件/目录的属性，1个字节，8位，每一位代表不同的含义（为“1”表示“是”，为“0”表示否）
     * 第7位  第6位  第5位  第4位   第3位   第2位    第1位   第0位
     * 未使用 未使用 未使用 未使用 目录属性 普通文件 系统文件 只读文件
     * 该字节为 3（00000011），表示该目录是一个只读系统文件的登记项
     * 该字节为 4（00000100），表示该目录是一个可读可写的普通文件
     */
    private Byte property;

    /**
     * 文件/目录的起始盘块号，1个字节
     */
    private Byte beginFatNum;

    /**
     * 长度，1个字节（单位为盘块）
     * 对文件来说是文件长度，对目录来说为0
     */
    private Byte length;



    public String getName() {
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Byte getProperty() {
        return property;
    }

    public void setProperty(Byte property) {
        this.property = property;
    }

    public Byte getBeginFatNum() {
        return beginFatNum;
    }

    public void setBeginFatNum(Byte beginFatNum) {
        this.beginFatNum = beginFatNum;
    }

    public Byte getLength() {
        return length;
    }

    public void setLength(Byte length) {
        this.length = length;
    }

    public byte[] getBytes () {
        StringBuilder stringBuilder = new StringBuilder(name).append(type);
        byte[] bytes = Arrays.copyOf(stringBuilder.toString().getBytes(), 8);
        bytes[5] = property;
        bytes[6] = beginFatNum;
        bytes[7] = length;
        return bytes;
    }

    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", property=" + property +
                ", beginFatNum=" + beginFatNum +
                ", length=" + length +
                '}';
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        RegItem regItem = (RegItem) obj;
        boolean result =
                this.name.equals(regItem.getName()) &&
                        this.type.equals(regItem.getType()) &&
                        this.property.equals(regItem.getProperty()) &&
                        this.beginFatNum.equals(regItem.getBeginFatNum()) &&
                        this.length.equals(regItem.getLength());
        return result;
    }
}
